home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / assembler / progasm1.lha / SORGENTI3 / LEZIONE7o.s < prev    next >
Text File  |  1994-11-28  |  10KB  |  323 lines

  1.  
  2. ; Lezione7o.s - esempio di applicazione della routine universale:
  3. ;        due sprite mossi dalla stessa routine
  4.  
  5.  
  6.     SECTION    CiriCop,CODE
  7.  
  8. Inizio:
  9.     move.l    4.w,a6        ; Execbase
  10.     jsr    -$78(a6)    ; Disable
  11.     lea    GfxName(PC),a1    ; Nome lib
  12.     jsr    -$198(a6)    ; OpenLibrary
  13.     move.l    d0,GfxBase
  14.     move.l    d0,a6
  15.     move.l    $26(a6),OldCop    ; salviamo la vecchia COP
  16.  
  17. ;    Puntiamo la PIC "vuota"
  18.  
  19.     MOVE.L    #BITPLANE,d0    ; dove puntare
  20.     LEA    BPLPOINTERS,A1    ; puntatori COP
  21.     move.w    d0,6(a1)
  22.     swap    d0
  23.     move.w    d0,2(a1)
  24.  
  25. ;    Puntiamo lo sprite
  26.  
  27.     MOVE.L    #MIOSPRITE,d0        ; indirizzo dello sprite in d0
  28.     LEA    SpritePointers,a1    ; Puntatori in copperlist
  29.     move.w    d0,6(a1)
  30.     swap    d0
  31.     move.w    d0,2(a1)
  32.  
  33.     addq.l    #8,a1            ; puntatore a sprite 1
  34.     MOVE.L    #MIOSPRITE2,d0        ; indirizzo dello sprite in d0
  35.     move.w    d0,6(a1)
  36.     swap    d0
  37.     move.w    d0,2(a1)
  38.  
  39.     move.l    #COPPERLIST,$dff080    ; nostra COP
  40.     move.w    d0,$dff088        ; START COP
  41.     move.w    #0,$dff1fc        ; NO AGA!
  42.     move.w    #$c00,$dff106        ; NO AGA!
  43.  
  44. mouse:
  45.     cmpi.b    #$aa,$dff006    ; Linea $aa?
  46.     bne.s    mouse
  47.  
  48.     btst    #2,$dff016
  49.     beq.s    aspetta
  50.     bsr.w    MuoviSprite    ; Muovi lo sprite 0
  51.  
  52. Aspetta:
  53.     cmpi.b    #$aa,$dff006    ; linea $aa?
  54.     beq.s    Aspetta
  55.  
  56.     btst    #6,$bfe001    ; mouse premuto?
  57.     bne.s    mouse
  58.  
  59.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  60.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  61.  
  62.     move.l    4.w,a6
  63.     jsr    -$7e(a6)    ; Enable
  64.     move.l    gfxbase(PC),a1
  65.     jsr    -$19e(a6)    ; Closelibrary
  66.     rts
  67.  
  68. ;    Dati
  69.  
  70. GfxName:
  71.     dc.b    "graphics.library",0,0
  72.  
  73. GfxBase:
  74.     dc.l    0
  75.  
  76. OldCop:
  77.     dc.l    0
  78.  
  79.  
  80. ; Questa routine legge dalle 2 tabelle le coordinate reali degli sprite.
  81. ; Cioe` la coordinata X varia da 0 a 320 e la Y da 0 a 256 (senza overscan).
  82. ; Poiche` in questo esempio non usiamo l'overscan, la tabella delle coordinate
  83. ; Y e` una tabella di byte. La tabella delle coordinate X, invece e` fatta
  84. ; di word perche` deve contenere anche valori maggiori di 256.
  85. ; Questa routine, pero` non posiziona direttamente lo sprite. Essa si limita
  86. ; semplicemente a farlo fare alla routine universale, comunicandogli le
  87. ; coordinate tramite i registri d0 e d1
  88.  
  89. MuoviSprite:
  90.     ADDQ.L    #1,TABYPOINT     ; Fai puntare al byte successivo
  91.     MOVE.L    TABYPOINT(PC),A0 ; indirizzo contenuto in long TABXPOINT
  92.                  ; copiato in a0
  93.     CMP.L    #FINETABY-1,A0  ; Siamo all'ultimo byte della TAB?
  94.     BNE.S    NOBSTARTY    ; non ancora? allora continua
  95.     MOVE.L    #TABY-1,TABYPOINT ; Riparti a puntare dal primo byte
  96. NOBSTARTY:
  97.     moveq    #0,d0        ; Pulisci d0
  98.     MOVE.b    (A0),d0        ; copia il byte della tabella, cioe` la
  99.                 ; coordinata Y in d0 in modo da farla
  100.                 ; trovare alla routine universale
  101.  
  102.     ADDQ.L    #2,TABXPOINT     ; Fai puntare alla word successiva
  103.     MOVE.L    TABXPOINT(PC),A0 ; indirizzo contenuto in long TABXPOINT
  104.                  ; copiato in a0
  105.     CMP.L    #FINETABX-2,A0  ; Siamo all'ultima word della TAB?
  106.     BNE.S    NOBSTARTX    ; non ancora? allora continua
  107.     MOVE.L    #TABX-2,TABXPOINT ; Riparti a puntare dalla prima word-2
  108. NOBSTARTX:
  109.     moveq    #0,d1        ; azzeriamo d1
  110.     MOVE.w    (A0),d1        ; poniamo il valore della tabella, cioe`
  111.                 ; la coordinata X in d1
  112.  
  113.     lea    MIOSPRITE,a1    ; indirizzo dello sprite in A1
  114.     moveq    #13,d2        ; altezza dello sprite in d2
  115.  
  116.     bsr.w    UniMuoviSprite  ; esegue la routine universale che posiziona
  117.                 ; lo sprite
  118. ; secondo sprite
  119.  
  120.     ADDQ.L    #1,TABYPOINT2     ; Fai puntare al byte successivo
  121.     MOVE.L    TABYPOINT2(PC),A0 ; indirizzo contenuto in long TABXPOINT
  122.                  ; copiato in a0
  123.     CMP.L    #FINETABY-1,A0  ; Siamo all'ultimo byte della TAB?
  124.     BNE.S    NOBSTARTY2    ; non ancora? allora continua
  125.     MOVE.L    #TABY-1,TABYPOINT2 ; Riparti a puntare dal primo byte
  126. NOBSTARTY2:
  127.     moveq    #0,d0        ; Pulisci d0
  128.     MOVE.b    (A0),d0        ; copia il byte della tabella, cioe` la
  129.                 ; coordinata Y in d0 in modo da farla
  130.                 ; trovare alla routine universale
  131.  
  132.     ADDQ.L    #2,TABXPOINT2     ; Fai puntare alla word successiva
  133.     MOVE.L    TABXPOINT2(PC),A0 ; indirizzo contenuto in long TABXPOINT
  134.                  ; copiato in a0
  135.     CMP.L    #FINETABX-2,A0  ; Siamo all'ultima word della TAB?
  136.     BNE.S    NOBSTARTX2    ; non ancora? allora continua
  137.     MOVE.L    #TABX-2,TABXPOINT2 ; Riparti a puntare dalla prima word-2
  138. NOBSTARTX2:
  139.     moveq    #0,d1        ; azzeriamo d1
  140.     MOVE.w    (A0),d1        ; poniamo il valore della tabella, cioe`
  141.                 ; la coordinata X in d1
  142.  
  143.     lea    MIOSPRITE2,a1    ; indirizzo dello sprite in A1
  144.     moveq    #8,d2        ; altezza dello sprite in d2
  145.  
  146.     bsr.w    UniMuoviSprite  ; esegue la routine universale che posiziona
  147.                 ; lo sprite
  148.     rts
  149.  
  150. ; puntatori alle tabelle del primo sprite
  151.  
  152. TABYPOINT:
  153.     dc.l    TABY-1
  154. TABXPOINT:
  155.     dc.l    TABX-2
  156.  
  157. ; puntatori alle tabelle del secondo sprite
  158.  
  159. TABYPOINT2:
  160.     dc.l    TABY+40-1
  161. TABXPOINT2:
  162.     dc.l    TABX+96-2
  163.  
  164. ; Tabella con coordinate Y dello sprite precalcolate.
  165. TABY:
  166.     incbin    "ycoordinatok.tab"    ; 200 valori .B
  167. FINETABY:
  168.  
  169. ; Tabella con coordinate X dello sprite precalcolate.
  170. TABX:
  171.     incbin    "xcoordinatok.tab"    ; 150 valori .W
  172. FINETABX:
  173.  
  174. ; Routine universale di posizionamento degli sprite.
  175.  
  176. ;
  177. ;    Parametri in entrata di UniMuoviSprite:
  178. ;
  179. ;    a1 = Indirizzo dello sprite
  180. ;    d0 = posizione verticale Y dello sprite sullo schermo (0-255)
  181. ;    d1 = posizione orizzontale X dello sprite sullo schermo (0-320)
  182. ;    d2 = altezza dello sprite
  183. ;
  184.  
  185. UniMuoviSprite:
  186. ; posizionamento verticale
  187.     ADD.W    #$2c,d0        ; aggiungi l'offset dell'inizio dello schermo
  188.  
  189. ; a1 contiene l'indirizzo dello sprite
  190.     MOVE.b    d0,(a1)        ; copia il byte in VSTART
  191.     btst.l    #8,d0
  192.     beq.s    NonVSTARTSET
  193.     bset.b    #2,3(a1)    ; Setta il bit 8 di VSTART (numero > $FF)
  194.     bra.s    ToVSTOP
  195. NonVSTARTSET:
  196.     bclr.b    #2,3(a1)    ; Azzera il bit 8 di VSTART (numero < $FF)
  197. ToVSTOP:
  198.     ADD.w    D2,D0        ; Aggiungi l'altezza dello sprite per
  199.                 ; determinare la posizione finale (VSTOP)
  200.     move.b    d0,2(a1)    ; Muovi il valore giusto in VSTOP
  201.     btst.l    #8,d0
  202.     beq.s    NonVSTOPSET
  203.     bset.b    #1,3(a1)    ; Setta il bit 8 di VSTOP (numero > $FF)
  204.     bra.w    VstopFIN
  205. NonVSTOPSET:
  206.     bclr.b    #1,3(a1)    ; Azzera il bit 8 di VSTOP (numero < $FF)
  207. VstopFIN:
  208.  
  209. ; posizionamento orizzontale
  210.     add.w    #128,D1        ; 128 - per centrare lo sprite.
  211.     btst    #0,D1        ; bit basso della coordinata X azzerato?
  212.     beq.s    BitBassoZERO
  213.     bset    #0,3(a1)    ; Settiamo il bit basso di HSTART
  214.     bra.s    PlaceCoords
  215.  
  216. BitBassoZERO:
  217.     bclr    #0,3(a1)    ; Azzeriamo il bit basso di HSTART
  218. PlaceCoords:
  219.     lsr.w    #1,D1        ; SHIFTIAMO, ossia spostiamo di 1 bit a destra
  220.                 ; il valore di HSTART, per "trasformarlo" nel
  221.                 ; valore fa porre nel byte HSTART, senza cioe'
  222.                 ; il bit basso.
  223.     move.b    D1,1(a1)    ; Poniamo il valore XX nel byte HSTART
  224.     rts
  225.  
  226.  
  227.     SECTION    GRAPHIC,DATA_C
  228.  
  229. COPPERLIST:
  230. SpritePointers:
  231.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  232.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  233.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  234.     dc.w    $13e,0
  235.  
  236.     dc.w    $8E,$2c81    ; DiwStrt
  237.     dc.w    $90,$2cc1    ; DiwStop
  238.     dc.w    $92,$38        ; DdfStart
  239.     dc.w    $94,$d0        ; DdfStop
  240.     dc.w    $102,0        ; BplCon1
  241.     dc.w    $104,0        ; BplCon2
  242.     dc.w    $108,0        ; Bpl1Mod
  243.     dc.w    $10a,0        ; Bpl2Mod
  244.  
  245.             ; 5432109876543210
  246.     dc.w    $100,%0001001000000000    ; bit 12 acceso!! 1 bitplane lowres
  247.  
  248. BPLPOINTERS:
  249.     dc.w $e0,0,$e2,0    ;primo     bitplane
  250.  
  251.     dc.w    $180,$000    ; color0    ; sfondo nero
  252.     dc.w    $182,$123    ; color1    ; colore 1 del bitplane, che
  253.                         ; in questo caso e' vuoto,
  254.                         ; per cui non compare.
  255.  
  256.     dc.w    $1A2,$F00    ; color17, ossia COLOR1 dello sprite0 - ROSSO
  257.     dc.w    $1A4,$0F0    ; color18, ossia COLOR2 dello sprite0 - VERDE
  258.     dc.w    $1A6,$FF0    ; color19, ossia COLOR3 dello sprite0 - GIALLO
  259.  
  260.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  261.  
  262.  
  263. ; ************ Ecco lo sprite: OVVIAMENTE deve essere in CHIP RAM! ************
  264.  
  265. MIOSPRITE:        ; lunghezza 13 linee
  266.     dc.b $50    ; Posizione verticale di inizio sprite (da $2c a $f2)
  267.     dc.b $90    ; Posizione orizzontale di inizio sprite (da $40 a $d8)
  268.     dc.b $5d    ; $50+13=$5d    ; posizione verticale di fine sprite
  269.     dc.b $00
  270.  dc.w    %0000000000000000,%0000110000110000 ; Formato binario per modifiche
  271.  dc.w    %0000000000000000,%0000011001100000
  272.  dc.w    %0000000000000000,%0000001001000000
  273.  dc.w    %0000000110000000,%0011000110001100 ;BINARIO 00=COLORE 0 (TRASPARENTE)
  274.  dc.w    %0000011111100000,%0110011111100110 ;BINARIO 10=COLORE 1 (ROSSO)
  275.  dc.w    %0000011111100000,%1100100110010011 ;BINARIO 01=COLORE 2 (VERDE)
  276.  dc.w    %0000110110110000,%1111100110011111 ;BINARIO 11=COLORE 3 (GIALLO)
  277.  dc.w    %0000011111100000,%0000011111100000
  278.  dc.w    %0000011111100000,%0001111001111000
  279.  dc.w    %0000001111000000,%0011101111011100
  280.  dc.w    %0000000110000000,%0011000110001100
  281.  dc.w    %0000000000000000,%1111000000001111
  282.  dc.w    %0000000000000000,%1111000000001111
  283.  dc.w    0,0    ; 2 word azzerate definiscono la fine dello sprite.
  284.  
  285.  
  286. MIOSPRITE2:        ; lunghezza 8 linee
  287. VSTART2:
  288.     dc.b $60    ; Pos. verticale (da $2c a $f2)
  289. HSTART2:
  290.     dc.b $60+(14*2)    ; Pos. orizzontale (da $40 a $d8)
  291. VSTOP2:
  292.     dc.b $68    ; $60+8=$68    ; fine verticale.
  293.     dc.b $00
  294.  dc.w    %0000001111000000,%0111110000111110
  295.  dc.w    %0000111111110000,%1111000111001111
  296.  dc.w    %0011111111111100,%1100001000100011
  297.  dc.w    %0111111111111110,%1000000000100001
  298.  dc.w    %0111111111111110,%1000000111000001
  299.  dc.w    %0011111111111100,%1100001000000011
  300.  dc.w    %0000111111110000,%1111001111101111
  301.  dc.w    %0000001111000000,%0111110000111110
  302.  dc.w    0,0    ; fine sprite
  303.  
  304.  
  305.     SECTION    PLANEVUOTO,BSS_C    ; Il bitplane azzerato che usiamo,
  306.                     ; perche' per vedere gli sprite
  307.                     ; e' necessario che ci siano bitplanes
  308.                     ; abilitati
  309. BITPLANE:
  310.     ds.b    40*256        ; bitplane azzerato lowres
  311.  
  312.     end
  313.  
  314. In questo esempio mostriamo la versatilita` della routine UniMuoviSprite.
  315. Abbiamo 2 sprites di forma e altezza diversa, ed entrambi sono mossi sullo 
  316. schermo dalla routine. Infatti la routine Muovisprite, legge dalle tabelle le
  317. coordinate degli sprites, e poi chiama per ognuno degli sprite la routine
  318. UniMuoviSprite. Notate come ogni volta la routine MuoviSprite metta nel
  319. registro a1 l'indirizzo dello sprite (che e` ovviamente diverso per i 2
  320. sprites). Poiche` inoltre i 2 sprite hanno altezze diverse, prima di chiamare
  321. UnMuoviSprite ogni volta viene messo in d2 un valore diverso, cioe` quello
  322. dell'altezza di ciascun sprite.
  323.